/*
 *  Copyright (C) 2010 Glauco
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.balisunrise.common;

import java.lang.reflect.Field;
import java.util.Properties;
import org.balisunrise.annotation.ColumnDefinition;
import org.balisunrise.annotation.ColumnEmbedded;
import org.balisunrise.annotation.ColumnSelection;
import org.balisunrise.annotation.CriteriaDefinition;
import org.balisunrise.annotation.CriteriaEmbedded;
import org.balisunrise.annotation.CriteriaSelection;
import org.balisunrise.annotation.FieldDefinition;
import org.balisunrise.annotation.FieldEmbedded;
import org.balisunrise.annotation.FieldSelection;

/**
 * Inteface de leitura das propriedades do Aplicativo e de propriedades dos
 * atributos (Campos/Fields).
 * @author Glauco
 */
public interface PropertiesReader {

    public static final String messageTRUE = "org.balisunrise.messages.TRUE";
    public static final String messageFALSE = "org.balisunrise.messages.FALSE";
    public static final String messageBOTH = "org.balisunrise.messages.BOTH";
    public static final String messageTO = "org.balisunrise.messages.TO";
    public static final String messageEXIT = "org.balisunrise.messages.EXIT";
    public static final String messageINVALID_INPUT = "org.balisunrise.messages.INVALID_INPUT";
    public static final String searchToolTipText = "org.balisunrise.tooltiptext.search";
    public static final String newToolTipText = "org.balisunrise.tooltiptext.new";
    public static final String editToolTipText = "org.balisunrise.tooltiptext.edit";
    public static final String deleteToolTipText = "org.balisunrise.tooltiptext.delete";
    public static final String confirmToolTipText = "org.balisunrise.tooltiptext.confirm";
    public static final String cancelToolTipText = "org.balisunrise.tooltiptext.cancel";
    public static final String selectToolTipText = "org.balisunrise.tooltiptext.select";
    public static final String confirmText = "org.balisunrise.text.confirm";
    public static final String cancelText = "org.balisunrise.text.cancel";
    public static final String selectText = "org.balisunrise.text.select";
    public static final String noSelectedEntity = "org.balisunrise.text.noSelectedEntity";
    public static final String selectOneEntity = "org.balisunrise.text.selectOneEntity";
    public static final String maxResults = "org.balisunrise.entityloader.maxResults";
    public static final String dataFormat = "org.balisunrise.dataFormat";

    /**
     * Nesta propriedade são adicionadas os path dos jars a serem adicionados
     * ao JavaLoad path em tempo de execução<br>
     * Utilize ponto e virgula (;) para incluir varios arquivos<br>
     * Veja um exemplo abaixo:<br>
     * myJarFile.jar;otherJarFile.jar;lastJarFile.jar
     */
    public static final String jars = "org.balisunrise.jars";

    /**
     * String utilizado pelo método processText para verificar se o texto
     * deve ser buscado das propriedades do sistema.<br>
     * Está variável possui o valor "PROP:" e quando um texto tem
     * essa subString na frete, o restante da string será utilizado para
     * busca uma propriedade do sistema.
     *
     * @see #processText(java.lang.String)
     * @see #readProperty(java.lang.String)
     */
    public static final String PROP = "PROP:";
    
    /**
     * Lê propriedades das anotações do campo.
     */
    public Properties readFieldProperties(Field field);

    /**
     * Lê propriedades do FieldDefinition.
     */
    public Properties readFieldDefinitionProperties(
            FieldDefinition field);

    /**
     * Lê propriedades do FieldEmbedded.
     */
    public Properties readFieldEmbeddedProperties(
            FieldEmbedded field);

    /**
     * Lê propriedades do FieldSelection.
     * @param field
     * @return
     */
    public Properties readFieldSelectionProperties(
            FieldSelection field);

    /**
     * Lê propriedades do CriteriaDefinition.
     */
    public Properties readCriteriaDefinitionProperties(
            CriteriaDefinition criteria);

    /**
     * Lê propriedades do CriteriaEmbedded.
     */
    public Properties readCriteriaEmbeddedProperties(
            CriteriaEmbedded criteria);

    /**
     * Lê propriedades do CriteriaSelection.
     */
    public Properties readCriteriaSelectionProperties(
            CriteriaSelection criteria);

    /**
     * Lê propriedades da ColumnDefinition.
     */
    public Properties readColumnDefinitionProperties(
            ColumnDefinition column);

    /**
     * Lê propriedades da ColumnEmbedded.
     */
    public Properties readColumnEmbeddedProperties(
            ColumnEmbedded column);

    /**
     * Lê propriedades da ColumnSelection.
     */
    public Properties readColumnSelectionProperties(
            ColumnSelection column);

    /**
     * Lê um propriedade do Aplicativo.
     */
    public String readProperty(String name);

    /**
     * Verifica se o texto é uma propriedade do sistema.<br>
     * Quando o texto começa com a String <code>PROP</code> (constante da classe
     * <code>PropertiesReader</code>) será buscado o valor da propriedade do
     * sistema.
     *
     * @see #PROP
     * @param text texto.
     * @return o valor da propriedade do sistema ou o próprio texto se não for
     * para ler uma propriedade.
     */
    public String processText(String text);
}
